package com.woniu.commons.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 修改哈希数据中某个字段的值
     */
    public void hset(String key, String hashKey, Object value) {
        stringRedisTemplate.opsForHash().put(key, hashKey, value.toString());
    }

    /*
     此命令会覆盖哈希表中已存在的字段。如果哈希表不存在，会创建一个空哈希表，并执行 HMSET 操作
     */
    public void hmset(String key, Map<String, Object> map) {
        stringRedisTemplate.opsForHash().putAll(key, map);
    }

    /**
     * 从 zset 中删除一个数据
     */
    public long zsetRemove(String key, String value) {
        return stringRedisTemplate.opsForZSet().remove(key, value);
    }

    /*
    zset新增一个数据
     */
    public void zsetAdd(String key, String value, double score) {
        stringRedisTemplate.opsForZSet().add(key, value, score);
    }

    /*
     使Hash中的一个数据自增
    */
    public void hincrby(String key, Integer num) {
        stringRedisTemplate.opsForHash().increment(key, "cartNum", num);
    }

    /**
     * 从 zset 中删除一个数据
     */
    public Long zrem(String key, String values) throws Exception {
        return stringRedisTemplate.opsForZSet().remove(key, values);
    }

    /*
   查询一个hash数据
    */
    public Map<Object, Object> hgetall(String key) {
        return stringRedisTemplate.opsForHash().entries(key);
    }

    /*
    获取一个数据在ZSET中的排序值
     */
    public Double zscore(String key, String value) {
        return stringRedisTemplate.opsForZSet().score(key, value);
    }


    /**
     * 读取数据
     */
    public String get(final String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /*
    判断redis中是否存在这个键
     */
    public boolean exist(String key) {
        return stringRedisTemplate.hasKey(key);
    }

    /*
   使redis中的某个key值自增1
    */
    public void incr(String key) {
        stringRedisTemplate.opsForValue().increment(key);
    }

    /**
     * 删除数据
     */
    public void delete(final String key) {
        stringRedisTemplate.delete(key);
    }

    /**
     * 向Redis中存储一个字符串并设置有效时间
     */
    public void set(final String key, String value, long seconds) {
        stringRedisTemplate.opsForValue().set(key, value, seconds, TimeUnit.SECONDS);
    }
}
